(function($) {
    "use strict";

    $.fn.email_validation = function () {
        var func=arguments[0];
        return this.each(function(){
            var ts=$(this);
            if(ts.attr("required")){
                var error=ts.data("error");
                var highlight=ts.data("highlight");
                if(!error){
                    error='It must be an e-mail address.';
                }
                var pattern="^.+@.+\..+$";
                ts.after("<p class='error-info'>"+error+"</p>");
                var _after=ts.parent();
                var er=ts.next(".error-info");
                var patt1=new RegExp(pattern);
                var default_color=ts.css("border-color");
                ts.keyup(function(){
                    ts.data("pass",false);
                    if(!patt1.test($(this).val())){
                        if(!_after.hasClass("error-show")){
                            _after.addClass("error-show");
                            er.animate({height:"20px"});
                            ts.css("border-color",highlight);
                        }
                    }else{
                        _after.removeClass("error-show");
                        er.animate({height:"0px"});
                        ts.data("pass",true);
                        ts.css("border-color",default_color);
                    }
                    if(func){
                        func(ts);
                    }
                });
            }
        });
    }

    $.fn.len_validation = function () {
        var func=arguments[0];
        return this.each(function(){
            var ts=$(this);
            if(ts.attr("required")){
                var error=ts.data("error");
                var min=ts.data("min");
                var max=ts.data("max");
                var highlight=ts.data("highlight");
                if(!min){
                    min=5;
                }
                if(!error){
                    error='Minimum length must be greater than '+min+' characters.';
                }
                ts.after("<p class='error-info'>"+error+"</p>");
                var _after=ts.parent();
                var er=ts.next(".error-info");
                var default_color=ts.css("border-color");
                ts.keyup(function(){
                    ts.data("pass",false);
                    if($(this).val().length<min||(max&&$(this).val().length>max)){
                        if($(this).val().length<min){
                            er.html('Minimum length must be greater than '+min+' characters.');
                        }
                        if($(this).val().length>max){
                            er.html('Maximum length must be smaller than '+max+' characters.');
                        }
                        if(!_after.hasClass("error-show")){
                            _after.addClass("error-show");
                            er.animate({height:"20px"});
                            ts.css("border-color",highlight);
                        }
                    }else{
                        _after.removeClass("error-show");
                        er.animate({height:"0px"});
                        ts.data("pass",true);
                        ts.css("border-color",default_color);
                    }
                    if(func){
                        func(ts);
                    }

                });
            }
        });
    }
    $.fn.card_nums_validation = function () {
        return this.each(function(){
            var ts=$(this);
            var _for=ts.attr("for");
            ts.keydown(function(e){
                var _char=e.keyCode;
                var key=ts.val().replace(/\s/g,"");
                var len=0;
                if(_char==8){
                    if(key.length-1>1){
                        len=key.length-1;
                    }else{
                        len=1;
                    }

                }else{
                    len=key.length+1;
                }
                if((_char<48||_char>57)&&_char!=8&&_char!=116&&(_char<96||_char>105)&&_char!=37&&_char!=39&&_char!=9){
                    return false;
                }
                if(len>16&&_char!=37&&_char!=39&&_char!=116&&_char!=9){
                    return false;
                }
                if(len>1&&len%4==1&&_char!=8&&_char!=37&&_char!=39&&_char!=116&&_char!=9){
                    ts.val(ts.val()+"  ");

                }
            });
            ts.keyup(function(e){
                if(_for){
                    if(ts.val().length>0){
                        $(_for).html(ts.val());
                    }else{
                        $(_for).html("•••• •••• •••• ••••");
                    }

                }
            });
        });
    }
    $.fn.card_name_validation = function () {
        return this.each(function(){
            var ts=$(this);
            var _for=ts.attr("for");
            ts.keydown(function(e){
                var _char=e.keyCode;
                if(ts.val().length>=20&&_char!=8&&_char!=116&&_char!=37&&_char!=39&&_char!=9){
                    return false;
                }
            });
            ts.keyup(function(e){
                if(_for){
                    if(ts.val().length>0&&ts.val().length<=20){
                        $(_for).html(ts.val());
                    }else if(ts.val().length==0){
                        $(_for).html("FULL NAME");
                    }

                }
            });
        });
    }

    $.fn.card_expiry_validation = function () {
        return this.each(function(){
            var ts=$(this);
            var _for=ts.attr("for");
            ts.keydown(function(e){
                var _char=e.keyCode;
                var key=ts.val();
                if(_char>95&&_char<106){
                    _char=_char-48;
                }
                var input_key=String.fromCharCode(_char);
                var arr=key.split(' / ');
                var rkey=0;

                if((_char<48||_char>57)&&_char!=8&&_char!=116&&(_char<96||_char>105)&&_char!=37&&_char!=39&&_char!=9){
                    return false;
                }
                if(_char==37||_char==39||_char==8||_char==116||_char==9){
                    if(arr.length==2){
                        if(arr[1].length==1){
                            ts.val(arr[0]);
                            return false;
                        }
                    }
                    return true;
                }
                if(arr.length==2){
                    rkey=parseInt(arr[1]+input_key);
                    if(rkey.toString().length>4&&key.length>8){
                        return false;
                    }
                }else{
                    rkey=parseInt(key+input_key);
                    if(rkey.toString().length<2&&rkey>1){
                        ts.val("0"+rkey+" / ");
                        return false;
                    }else if(rkey.toString().length==2){
                        if(rkey<=12){
                            ts.val(rkey+" / ");
                        }
                        return false;
                    }else if(rkey.toString().length>2){
                        return false;
                    }
                }
            });
            ts.keyup(function(e){
                if(_for){
                    if(ts.val().length>0){
                        $(_for).html(ts.val());
                    }else if(ts.val().length==0){
                        $(_for).html("• • / • •");
                    }

                }
            });
        });
    }

    $.fn.card_cvc_validation = function () {
        return this.each(function () {
            var ts=$(this);
            var _for=ts.attr("for");
            var _back=ts.data("back");
            ts.focus(function(){
                if(_back){
                    $(_back).addClass("card-back");
                }

            });
            ts.blur(function(){
                if(_back) {
                    $(_back).removeClass("card-back");
                }
            });
            ts.keydown(function(e){
                var _char=e.keyCode;
                if((_char<48||_char>57)&&_char!=8&&_char!=116&&(_char<96||_char>105)&&_char!=37&&_char!=39&&_char!=9){
                    return false;
                }
                if(_char==37||_char==39||_char==8||_char==116&&_char==9){
                    return true;
                }
                if(ts.val().length>=4){
                    return false;
                }
            });
            ts.keyup(function(e){
                if(_for){
                    if(ts.val().length>0&&ts.val().length<=4){
                        $(_for).html(ts.val());
                    }else if(ts.val().length==0){
                        $(_for).html("• • •");
                    }

                }
            });
        });
    }

}(jQuery));
